package com.example.leadnews.user.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.拦截请求头里面的token
        String token = request.getHeader("token");
        log.info("token:{}",token);
        //2.看redis中有没有这个token

        //2.1 没有->没登录过or登录过但是token过期了，不给放行
        if(!redisTemplate.hasKey(token)){
            log.info("没登录过or登录过但是token过期了，不给放行");
            return false;
        }

        //获取过期时间 还剩几秒
        Long expire = redisTemplate.getExpire(token);
        log.info("还剩:{}秒",expire);
        //2.2.1 有-> 有并且有效时间超过3分钟不要做任何处理，直接放行
        //2.2.2 有-> 有并且有效期不足3分钟，先把有效期增加5分钟，直接放行
        if(expire<180){
            /*
            1.先获取当前的时间戳（ms)
            2.加上 300*1000 ms -> 300s->5分钟
             */
            long expireAt=System.currentTimeMillis()+300000;
            //指定5分钟过期
            redisTemplate.expireAt(token,new Date(expireAt));
        }
        return true;
    }
}
